package org.springframework.context.support;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.core.convert.converter.ConverterRegistry;
import org.springframework.core.convert.converter.GenericConverter;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.convert.support.GenericConversionService;

import java.util.Set;

/**
 * @author derekyi
 * @date 2021/1/17
 */
public class ConversionServiceFactoryBean implements FactoryBean<ConversionService>, InitializingBean {
	//xml文件里他的成员变量，在xml文件里已经创建出来了。作为ref存入进去了
	//不过converters这个成员变量是干嘛用的，xml文件里有


	//返回一个set集合，其实就是一个类型转换器的集合，里面存了一个字符串转时间的类型转换器
	private Set<?> converters;

	private GenericConversionService conversionService;

	@Override
	public void afterPropertiesSet() throws Exception {
		//这里第二个成员变量自己new，第一个xml文件读取已经创建出来了
		conversionService = new DefaultConversionService();//看看这个类内部
		//注册进入，类型转换器集合，还有这个对象（他是用来存集合里所有的类型转换器的。）
		//registry的子类
		registerConverters(converters, conversionService);
	}

	private void registerConverters(Set<?> converters, ConverterRegistry registry) {
		//一个个遍历类型转换器集合里的类型转换器
		if (converters != null) {
			//看看是3种里那个类型
			for (Object converter : converters) {
				//最后会添加进去类型转换器
				if (converter instanceof GenericConverter) {
					registry.addConverter((GenericConverter) converter);
				} else if (converter instanceof Converter<?, ?>) {
					registry.addConverter((Converter<?, ?>) converter);
				} else if (converter instanceof ConverterFactory<?, ?>) {
					registry.addConverterFactory((ConverterFactory<?, ?>) converter);
				} else {
					throw new IllegalArgumentException("Each converter object must implement one of the " +
							"Converter, ConverterFactory, or GenericConverter interfaces");
				}
			}
		}
	}

	@Override
	public ConversionService getObject() throws Exception {
		//将成员变量conversionService返回（内部有set集合里所有的东西）
		return conversionService;
	}

	@Override
	public boolean isSingleton() {
		return true;
	}

	public void setConverters(Set<?> converters) {
		this.converters = converters;
	}
}
